package com.baturu.vin.hyundai.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

@Slf4j
@Service("kiaEPCVinAnalyser")
public class KiaEPCVinAnalyser {
//
//    public CarTypeDTO queryEPCCarTypeByVinCode(String vinCode) {
//        HyundaiKiaVehicleDTO hyundaiKiaVehicleDTO = getHyundaiKiaVehicleStyle(vinCode);
//        if(null == hyundaiKiaVehicleDTO){
//            return null;
//        }
//        String btrId = getKiaCarTypeBtrId(hyundaiKiaVehicleDTO);
//        KiaCarTypeDTO kiaCarTypeDTO = new KiaCarTypeDTO();
//        kiaCarTypeDTO.setBtrId(btrId);
//        kiaCarTypeDTO.setDisplacement(hyundaiKiaVehicleDTO.getEngine());
//        kiaCarTypeDTO.setTransmissionType(hyundaiKiaVehicleDTO.getGearbox());
//        kiaCarTypeDTO.setVehicleType(hyundaiKiaVehicleDTO.getBody());
//        return kiaCarTypeDTO;
//    }

//    public List<EPCPartsDTO> queryEPCParts(EPCPartsInfoRequest request) {
//        String vinCode = request.getVinCode();
//        String brandName = request.getAnalyserEnum();
//        List<String> partsNameList = request.getPartsNameList();
//        Set<String> partsCodes = request.getPartsCodes();
//        EPCPartsFillingParam epcPartsFillingParam = request.getEpcPartsFillingParam();
//        if (CollectionUtils.isEmpty(partsCodes) && CollectionUtils.isEmpty(partsNameList)) {
//            return Collections.emptyList();
//        }
//        if (CollectionUtils.isEmpty(partsCodes)) {
//            return queryEPCPartsByPartsName(vinCode, new HashSet<>(partsNameList), brandName, epcPartsFillingParam);
//        }
//        if (CollectionUtils.isEmpty(partsNameList))
//            return queryEPCPartsByPartsCode(vinCode, new HashSet<>(partsCodes), epcPartsFillingParam);
//        return queryEPCPartsByPartsCodeAndPartsName(vinCode, new HashSet<>(partsCodes),
//                new HashSet<>(partsNameList), brandName, epcPartsFillingParam);
//    }
//
//    private List<EPCPartsDTO> queryEPCPartsByPartsCodeAndPartsName(String vinCode, Set<String> partsCodes, Set<String> partsNames, String brandName, EPCPartsFillingParam epcPartsFillingParam) {
//        HyundaiKiaVehicleDTO hyundaiKiaVehicleDTO = getHyundaiKiaVehicleStyle(vinCode);
//        if(null == hyundaiKiaVehicleDTO){
//            return Collections.emptyList();
//        }
//        List<HyundaiKiaPartsMappingDTO> partsMappingDTOS = getPartsNameMap(brandName, partsNames);
//        if (CollectionUtils.isEmpty(partsMappingDTOS)) {
//            return Collections.emptyList();
//        }
//        HashMultimap<String, String> partsCodeGroupByPartsName = Maps2.newHashMultimapWithValue(partsMappingDTOS,
//                HyundaiKiaPartsMappingDTO::getPartsName, HyundaiKiaPartsMappingDTO::getPartsCode);
//        Set<String> newPartsCodes = partsMappingDTOS
//                .stream()
//                .map(HyundaiKiaPartsMappingDTO::getPartsCode)
//                .collect(Collectors.toSet());
//        partsCodes.removeIf(partsCode -> !newPartsCodes.contains(partsCode));
//        if (CollectionUtils.isEmpty(partsCodes)) {
//            return Collections.emptyList();
//        }
//        List<KiaPartsDTO> kiaPartsDTOs = filterByVinAndParts(hyundaiKiaVehicleDTO, partsCodes);
//        if (CollectionUtils.isEmpty(kiaPartsDTOs)) {
//            return Collections.emptyList();
//        }
//        return transformPartsCode(partsNames,partsCodeGroupByPartsName, kiaPartsDTOs, epcPartsFillingParam);
//    }
//
//    private List<EPCPartsDTO> queryEPCPartsByPartsCode(String vinCode, Set<String> partsCodes, EPCPartsFillingParam epcPartsFillingParam) {
//        HyundaiKiaVehicleDTO hyundaiKiaVehicleDTO = getHyundaiKiaVehicleStyle(vinCode);
//        if(null == hyundaiKiaVehicleDTO){
//            return Collections.emptyList();
//        }
//        List<KiaPartsDTO> kiaPartsDTOs = filterByVinAndParts(hyundaiKiaVehicleDTO, partsCodes);
//        if (CollectionUtils.isEmpty(kiaPartsDTOs)) {
//            return Collections.emptyList();
//        }
//        HashMultimap<String, KiaPartsDTO> partsCode2PartsDTOMap = Maps2.newHashMultimapWithValue(kiaPartsDTOs, KiaPartsDTO::getFinalPartsCode);
//        Set<Map.Entry<String, Collection<KiaPartsDTO>>> entries = partsCode2PartsDTOMap.asMap().entrySet();
//        List<EPCPartsDTO> epcPartsDTOs = Lists.newArrayList();
//        for (Map.Entry<String, Collection<KiaPartsDTO>> entry : entries) {
//            String partsCode = entry.getKey();
//            if(StringUtils.isBlank(partsCode)){
//                continue;
//            }
//            Collection<KiaPartsDTO> partsDTOs = entry.getValue();
//            EPCPartsDTO epcPartsDTO = new EPCPartsDTO();
//            epcPartsDTO.setPartsCode(partsCode);
//            if(null != epcPartsFillingParam && epcPartsFillingParam.isNeedPartsImage()){
//                List<EPCPartsImageDTO> partsImageDTOs = getPartsImageDTOs(partsDTOs.stream().collect(Collectors.toSet()));
//                epcPartsDTO.setEpcPartsImageDTOs(partsImageDTOs);
//            }
//            epcPartsDTOs.add(epcPartsDTO);
//        }
//        return epcPartsDTOs;
//    }
//
//    private List<EPCPartsDTO> queryEPCPartsByPartsName(String vinCode, Set<String> partsNames, String brandName, EPCPartsFillingParam epcPartsFillingParam) {
//        HyundaiKiaVehicleDTO hyundaiKiaVehicleDTO = getHyundaiKiaVehicleStyle(vinCode);
//        if(null == hyundaiKiaVehicleDTO){
//            return Collections.emptyList();
//        }
//        List<HyundaiKiaPartsMappingDTO> partsMappingDTOS = getPartsNameMap(brandName, partsNames);
//        if (CollectionUtils.isEmpty(partsMappingDTOS)) {
//            return Collections.emptyList();
//        }
//        HashMultimap<String, String> partsCodeGroupByPartsName = Maps2.newHashMultimapWithValue(partsMappingDTOS,
//                HyundaiKiaPartsMappingDTO::getPartsName, HyundaiKiaPartsMappingDTO::getPartsCode);
//        Set<String> partsCodes = partsMappingDTOS
//                .stream()
//                .map(HyundaiKiaPartsMappingDTO::getPartsCode)
//                .collect(Collectors.toSet());
//        List<KiaPartsDTO> kiaPartsDTOs = filterByVinAndParts(hyundaiKiaVehicleDTO, partsCodes);
//        if (CollectionUtils.isEmpty(kiaPartsDTOs)) {
//            return Collections.emptyList();
//        }
//        return transformPartsCode(partsNames, partsCodeGroupByPartsName, kiaPartsDTOs, epcPartsFillingParam);
//    }

//    public List<KiaPartsDTO> filterByVinAndParts(HyundaiKiaVehicleDTO hyundaiKiaVehicleDTO, Set<String> partsCodes) {
//        List<KiaPartsDTO> kiaPartsDTOs = getParts(hyundaiKiaVehicleDTO.getModel(), partsCodes);
//        if (CollectionUtils.isEmpty(kiaPartsDTOs)) {
//            return Collections.emptyList();
//        }
//        filterParts(kiaPartsDTOs, hyundaiKiaVehicleDTO);
//        return kiaPartsDTOs;
//    }
//    /**
//     * 查询配件信息,编码太多分多次查询,一次查询100个编码对应的数据
//     */
//    public List<KiaPartsDTO> getParts(String model, Set<String> partsCodes) {
//        return StreamKit.partitionStream(partsCodes, QUERY_COUNT)
//                .flatMap(d -> kiaPartsDAO.queryByBpnoAndPartsCode(model, Sets.newHashSet(d)).stream())
//                .collect(Collectors.toList());
//    }
//
//    public void filterParts(List<KiaPartsDTO> kiaPartsDTOs, HyundaiKiaVehicleDTO vehicleStyleDTO) {
//        List<String> vehicleConditions = buildVehicleFilterCondition(vehicleStyleDTO);
//        kiaPartsDTOs.removeIf(d -> !filterByPartsNote(d, vehicleConditions));
//        kiaPartsDTOs.removeIf(d -> !filterByDate(vehicleStyleDTO.getMakeDate(), d.getStartTime(), d.getEndTime()));
//        // kiaPartsDTOs.removeIf(d -> !filterByDate(vehicleStyleDTO.getMakeDate(),vehicleStyleDTO.getStartDate(), vehicleStyleDTO.getEndDate(), d.getStartTime(), d.getEndTime()));
//        kiaPartsDTOs.removeIf(d -> StringUtils.isNotBlank(vehicleStyleDTO.getBpno()) && !StringUtils.equals(d.getBpno(), vehicleStyleDTO.getBpno()));
//        //kiaPartsDTOs.removeIf(d -> !filterByVehicleCode(vehicleStyleDTO.getVehicleCode(), d.getVehicleCode()));
//    }


//    private List<EPCPartsDTO> transformPartsCode(Set<String> partsNames, HashMultimap<String, String> partsCodesGroupByPartsName, List<KiaPartsDTO> kiaParts, EPCPartsFillingParam epcPartsFillingParam) {
//        Set<String> partsCodes = kiaParts.stream().map(KiaPartsDTO::getFinalPartsCode).collect(Collectors.toSet());
//        HashMultimap<String, KiaPartsDTO> partsCode2PartsDTOMap = Maps2.newHashMultimapWithValue(kiaParts, KiaPartsDTO::getFinalPartsCode);
//        List<EPCPartsDTO> epcPartsDTOs = Lists.newArrayList();
//        partsNames.forEach(partsName -> {
//            Set<String> finalPartsCodes = partsCodesGroupByPartsName.get(partsName);
//            if (!CollectionUtils.isEmpty(finalPartsCodes)) {
//                finalPartsCodes = Sets.intersection(partsCodesGroupByPartsName.get(partsName), partsCodes).immutableCopy();
//            }
//            List<EPCPartsDTO> partsDTOs = getEpcPartsDTOs(epcPartsFillingParam, partsCode2PartsDTOMap, partsName, finalPartsCodes);
//            if(CollectionUtils.isNotEmpty(partsDTOs)){
//                epcPartsDTOs.addAll(partsDTOs);
//            }
//        });
//        return epcPartsDTOs;
//    }

//    public List<EPCPartsDTO> getEpcPartsDTOs(EPCPartsFillingParam epcPartsFillingParam, HashMultimap<String, KiaPartsDTO> partsCode2PartsDTOMap, String partsName, Set<String> finalPartsCodes) {
//        List<EPCPartsDTO> epcPartsDTOs = Lists.newArrayList();
//        Function<String, EPCPartsDTO> partsCode2EPCPartsDTOFunction = input -> {
//            if(null == input){
//                return null;
//            }
//            EPCPartsDTO epcPartsDTO = new EPCPartsDTO();
//            epcPartsDTO.setPartsCode(input);
//            epcPartsDTO.setBtrPartsName(partsName);
//            Set<KiaPartsDTO> kiaPartsDTOs = partsCode2PartsDTOMap.get(input);
//            if(null != epcPartsFillingParam && epcPartsFillingParam.isNeedPartsImage() && CollectionUtils.isNotEmpty(kiaPartsDTOs)){
//                List<EPCPartsImageDTO> epcPartsImageDTOs = getPartsImageDTOs(kiaPartsDTOs);
//                epcPartsDTO.setEpcPartsImageDTOs(epcPartsImageDTOs);
//            }
//            epcPartsDTOs.add(epcPartsDTO);
//            return epcPartsDTO;
//        };
//        return Lists2.transform(finalPartsCodes, partsCode2EPCPartsDTOFunction);
//    }
}